package cl.minvu.catastro.manager;

import java.math.BigInteger;
import java.util.Date;
import javax.persistence.EntityManager;
import javax.persistence.Query;

import org.apache.log4j.Logger;

import cl.minvu.catastro.model.Encuestador;
import cl.minvu.catastro.util.DateUtil;
import cl.minvu.catastro.util.PasswordManager;

/**
 * @author psep
 * 
 */
public class EncuestadorManager extends AbstractManager {

	private static final Logger logger = Logger
			.getLogger(EncuestadorManager.class);
	private static final EncuestadorManager instance = new EncuestadorManager();

	/**
	 * Constructor privado por defecto para
	 * el patrón Singleton.
	 */
	private EncuestadorManager() {
	}

	/**
	 * Método estático que retorna la instancia única
	 * de la clase EncuestadorManager con el patrón
	 * singleton.
	 * 
	 * @return EncuestadorManager
	 */
	public static final EncuestadorManager getInstance() {
		return instance;
	}

	/**
	 * @param encuestador
	 * @return
	 */
	public Encuestador getEncuestador(Encuestador encuestador) {
		Encuestador en = null;
		EntityManager em = null;
		StringBuilder sql = null;

		try {
			em = super.getEntityManager();
			sql = new StringBuilder();
			sql.append("SELECT e FROM Encuestador e JOIN e.persona p JOIN e.direccion d WHERE p.rut = :rut AND e.password = :password");

			if (encuestador.getToken() != null
					&& !encuestador.getToken().equals("")) {
				sql.append(" AND e.token = :token");
			}

			Query query = em.createQuery(sql.toString());
			query.setParameter("rut", encuestador.getPersona().getRut());
			query.setParameter("password",
					PasswordManager.encrypt(encuestador.getPassword()));

			if (encuestador.getToken() != null
					&& !encuestador.getToken().equals("")) {
				query.setParameter("token", encuestador.getToken());
			}

			en = (Encuestador) query.getSingleResult();

		} catch (Exception e) {
			logger.error(e, e);
		} finally {
			super.close(em);
		}

		return en;
	}

	/**
	 * @param encuestador
	 * @return
	 */
	public Integer countByRun(Encuestador encuestador) {
		Integer count = 0;
		EntityManager em = null;

		try {
			em = super.getEntityManager();

			Query sql = em
					.createQuery("SELECT COUNT(e) FROM Encuestador e JOIN e.persona p WHERE p.rut = :rut");
			sql.setParameter("rut", encuestador.getPersona().getRut());
			count = ((Long) sql.getSingleResult()).intValue();

		} catch (Exception e) {
			logger.error(e, e);
		} finally {
			super.close(em);
		}

		return count;
	}

	/**
	 * @param encuestador
	 * @return
	 */
	public Boolean createEncuestador(Encuestador encuestador) {
		boolean result = false;
		EntityManager em = null;

		try {
			em = super.getEntityManager();
			em.getTransaction().begin();

			BigInteger idPersona = PersonaManager.getInstance().createPersona(
					encuestador.getPersona(), em);
			BigInteger idDirecci = DireccionManager.getInstance()
					.createDireccion(encuestador.getDireccion(), em);

			if (idPersona == null || idDirecci == null) {
				em.getTransaction().rollback();
			} else {
				encuestador.getDireccion().setIddireccion(idDirecci);
				encuestador.getPersona().setIdpersona(idPersona);
				encuestador.setPassword(PasswordManager.encrypt(encuestador
						.getPassword()));
				encuestador.setFechainiciovigencia(new Date());
				encuestador.setFechaterminovigencia(DateUtil.getDateExpired());

				if (!this.createEncuestador(encuestador, em)) {
					em.getTransaction().rollback();
				} else {
					em.getTransaction().commit();
					result = true;
				}
			}
		} catch (Exception e) {
			logger.error(e, e);
		} finally {
			super.close(em);
		}

		return result;
	}

	/**
	 * @param encuestador
	 * @param em
	 * @return
	 */
	public Boolean createEncuestador(Encuestador encuestador, EntityManager em) {
		try {
			em.persist(encuestador);
			return true;
		} catch (Exception e) {
			logger.error(e, e);
		}

		return false;
	}

}
